# 导包
import pymysql


# 定义 数据库工具类
from config import DB_HOST


class DBTools(object):
    # 创建连接 - 类方法.可以直接使用类名调用！类方法的形参是cls（self是普通方法的形参）
    # 加装饰器 变成类方法
    @classmethod
    # 设置成私有:在方法名前加 __ ,其他地方调用的时候不可见
    def __create_conn(cls):
        conn = pymysql.connect(host=DB_HOST, port=3306, user='root', password='123456',
                               database='tpshop3.0', charset='utf8')
        # conn 只能在该方法内使用，
        # 不能遗漏，只有有返回值，其他地方调用了，接收了，才能使用
        return conn

    # 查一条记录 -封装为类方法，方便调用
    @classmethod
    def query_one(cls, sql):
        my_cursor = None
        my_conn = None
        res = None

        try:
            # 创建连接，借助类名，调用 类方法create_conn
            my_conn = DBTools.__create_conn()

            # 创建游标
            my_cursor = my_conn.cursor()

            # 执行sql语句，查看一条记录
            my_cursor.execute(sql)

            # 提取一条记录
            res = my_cursor.fetchone()
        except Exception as err:
            print('执行查询SQL失败：', err)
        finally:
            # 关闭游标
            my_cursor.close()

            # 关闭连接
            my_conn.close()

            return res
            # return之后不能再写代码

    # 增删改记录
    @classmethod
    def db_uid(cls, sql):
        my_conn = None
        my_cursor = None
        try:
            # 创建连接
            my_conn = DBTools.__create_conn()
            # 创建游标
            my_cursor = my_conn.cursor()
            # 执行 增删改 语句
            my_cursor.execute(sql)
            print('Affected rows:', my_conn.affected_rows())
            # 提交事务
            my_conn.commit()
        except Exception as err:
            print('执行 增删改 失败：', str(err))
            # 回滚事务
            my_conn.rollback()
        finally:
            # 关闭游标
            my_cursor.close()

            # 关闭连接
            my_conn.close()


if __name__ == '__main__':
    # result = DBTools.query_one('select * from students')
    # print('查询语句的结果：', result)

    DBTools.db_uid("update students set sex = '女' where name = '孙膑';")
